﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CAD.BLL;
using CAD.DTO;

namespace WFASmartketing.PRESENTACION_VENTAS
{
    public partial class RegistroVentas : Form
    {
        FrmPrincipal principal;
        private cliente cliente;
        AddCliente FRMcliente;
        public RegistroVentas(FrmPrincipal principal)
        {
            InitializeComponent();
            this.principal = principal;
        }
        private List<detalleVenta> CalcularDetalleVenta()
        {
            List<detalleVenta> detalle = new List<detalleVenta>();
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                detalleVenta det = new detalleVenta();
                det.Idproducto = Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value.ToString());
                det.Precio = Convert.ToDouble(dataGridView1.Rows[i].Cells[6].Value.ToString());
                det.Cantidad = Convert.ToInt32(dataGridView1.Rows[i].Cells[5].Value.ToString());
                detalle.Add(det);
            }
            return detalle;
        }
        private void button3_Click(object sender, EventArgs e)
        {
            if (dataGridView1.Rows.Count > 0)
            {
                int idalmacen = (int)cbxalmacen.SelectedValue;
                if (cliente == null)
                {
                    MessageBox.Show(this, "Selecciones un cliente", "ADVERTENCIA");
                    return;
                }
                int idcliente = cliente.Id;
                int idvendedor = (int)cbxvendedor.SelectedValue;
                int idacaja = (int)cbxcaja.SelectedValue;
                DateTime fecha = dtcfecha.Value;
                string nrodocumento = txtnrodocumento.Text;
                string gloza = txtgloza.Text;
                string tipocompra;
                string estadocompra;
                int idlogueado = principal.ObtenerLogueado().Id;
                double total = Convert.ToDouble(txttotal.Text);
                List<detalleVenta> detalle = CalcularDetalleVenta();

                //compra al credito
                if (rbcredito.Checked)
                {
                    tipocompra = "CREDITO";
                    estadocompra = "PENDIENTE";
                    int pkCompra = ventaBLL.insertar(idcliente, idvendedor, idlogueado, idalmacen, tipocompra, fecha, DateTime.Now, estadocompra, nrodocumento, total, gloza, idacaja);
                    try
                    {
                        for (int i = 0; i < detalle.Count; i++)
                        {
                            detalleVenta det = detalle.ElementAt(i);
                            detalleventaBLL.insertar(pkCompra, det.Idproducto, det.Cantidad, det.Precio);

                        } MessageBox.Show(this, "Se registro la venta exitosamente Nro Venta: " + pkCompra, "REGISTRO DE VENTA");
                        imprimirComprobante(pkCompra);
                        limpiarPantalla();
                        return;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(this, "No se registro la venta", "ERROR");
                        return;
                    }
                }

                //compra al contado

                tipocompra = "CONTADO";
                estadocompra = "PAGADO";
                caja caja = cajaBLL.SelectByID(idacaja);
                double montoActual = caja.Monto + total;
                try
                {
                    int pkCompra1 = ventaBLL.insertar(idcliente, idvendedor, idlogueado, idalmacen, tipocompra, fecha, DateTime.Now, estadocompra, nrodocumento, total, gloza, idacaja);
                    for (int i = 0; i < detalle.Count; i++)
                    {
                        detalleVenta det = detalle.ElementAt(i);
                        detalleventaBLL.insertar(pkCompra1, det.Idproducto, det.Cantidad, det.Precio);
                        cajaBLL.updatemonto(idacaja, montoActual);

                    } MessageBox.Show(this, "Se registro la venta exitosamente Nro Venta: " + pkCompra1, "REGISTRO DE VENTA");
                    imprimirComprobante(pkCompra1);
                    limpiarPantalla();
                    return;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, "No se registro la venta", "ERROR");
                    return;
                }
            }
            MessageBox.Show(this, "Inserte algun producto", "REGISTRO DE VENTA");
        }
        private void limpiarPantalla()
        {
            txtcantidad.Text = "";
            txtgloza.Text = "";
            txtimporte.Text = "";
            txtcambio.Text = "";
            txtnitcliente.Text = "";
            txtnombrecliente.Text = "";
            cliente = null;
            txtnrodocumento.Text = "";
            dataGridView1.Rows.Clear();
            txttotal.Text = calculartotales() + "";
            txtcantidad.Text = calcularCantidad() + "";
        }
        private void imprimirComprobante(int pkCompra)
        {
            MessageBoxButtons buttons = MessageBoxButtons.YesNo;
            DialogResult result;
            result = MessageBox.Show(this, "Desea Imprimir ver el comprobante", "REGISTRO DE DATOS", buttons);
            if (result == DialogResult.Yes)
            {
                REPORTES.WFComprobanteVenta compra = new REPORTES.WFComprobanteVenta(pkCompra);
                compra.MdiParent = principal;
                compra.Show();
                return;
            }
        }
        private void button7_Click(object sender, EventArgs e)
        {
            FRMcliente = new AddCliente(this);
            FRMcliente.MdiParent = principal;
            FRMcliente.Show();
        }
        public void cargarcliente(cliente pro)
        {
            txtnitcliente.Text = pro.Nit;
            txtnombrecliente.Text = pro.Nombreempresa;
            cliente = pro;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            PRESENTACION_VENTAS.AddProducto cliente = new PRESENTACION_VENTAS.AddProducto(this, (int)cbxalmacen.SelectedValue);
            cliente.MdiParent = principal;
            cliente.Show();
        }
        private bool verificarSiProductoRepetido(producto pro) {
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
              int idproducto = Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value.ToString());
              if (idproducto==pro.Id)
              {
               return true ;
              }
            }
            return false;
        }
        public void cargarProductoalGrid(producto pro, int cantidad)
        {
            if (verificarSiProductoRepetido(pro))
            {
                MessageBox.Show(this, "Este producto ya ha sido seleccionado, quitelo y agreguelo nuevamente para modificar su cantidad", "ADVERTENCIA");
                return;
            }
            marca marca = marcaBLL.SelectByID(pro.Idmarca);
            categoria cat = categoriaBLL.SelectCategoriaByID(pro.Idcategoria);
            Object[] obj = { pro.Id, pro.Codigoproducto, pro.Descripcion, marca.Nombre, cat.Nombre, cantidad, pro.Precioventaunitario, (cantidad * pro.Precioventaunitario) };
            dataGridView1.Rows.Add(obj);
            txttotal.Text = calculartotales() + "";
            txtcantidad.Text = calcularCantidad() + "";
            txtcambio.Text = calcularcambio() + "";
        }
        private int calcularCantidad()
        {
            int cantitdad = 0;
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                cantitdad = Convert.ToInt32(dataGridView1.Rows[i].Cells[5].Value.ToString()) + cantitdad;
            }
            return cantitdad;
        }
        private double calcularcambio()
        {
            double importe = 0;
            double total = 0;
            try
            {
                importe = Convert.ToDouble(txtimporte.Text);
            }
            catch (Exception)
            {

                importe = 0;
            }
            try
            {
                total = Convert.ToDouble(txttotal.Text);
            }
            catch (Exception)
            {

                total = 0;
            }
            return importe - total;

        }
        private double calculartotales()
        {
            double cantitdad = 0;
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                cantitdad = Convert.ToDouble(dataGridView1.Rows[i].Cells[7].Value.ToString()) + cantitdad;
            }
            return cantitdad;
        }
        private void RegistroVentas_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'vendedorDS.vendedor_selectAll' table. You can move, or remove it, as needed.
            this.vendedor_selectAllTableAdapter.Fill(this.vendedorDS.vendedor_selectAll);
            // TODO: This line of code loads data into the 'almacenDS.almacen_selectAll' table. You can move, or remove it, as needed.
            this.almacen_selectAllTableAdapter.Fill(this.almacenDS.almacen_selectAll);
            // TODO: This line of code loads data into the 'cajaDS.caja_selectAll' table. You can move, or remove it, as needed.
            this.caja_selectAllTableAdapter.Fill(this.cajaDS.caja_selectAll);
        }

        private void button6_Click(object sender, EventArgs e)
        {
            cliente pro = clienteBLL.SelectByID(2);
            cargarcliente(pro);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            this.Hide();
            if (FRMcliente != null)
            {
                FRMcliente.Close();
            }
        }

        private void RegistroVentas_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (FRMcliente != null)
            {
                FRMcliente.Close();
            }
        }

        private void radioButton4_CheckedChanged(object sender, EventArgs e)
        {
            cbxcaja.Enabled = false;
        }

        private void radioButton3_CheckedChanged(object sender, EventArgs e)
        {
            cbxcaja.Enabled = true;
        }

        private void txtimporte_KeyPress(object sender, KeyPressEventArgs e)
        {
            UTIIIDADES.UTILIDADES.soloDecimanes(e, txtimporte);
        }

        private void txtimporte_TextChanged(object sender, EventArgs e)
        {
            txtcambio.Text = calcularcambio() + "";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (dataGridView1.Rows.Count > 0)
            {
                if (dataGridView1.CurrentRow != null)
                {
                    int pos = dataGridView1.SelectedRows[0].Index;
                    dataGridView1.Rows.RemoveAt(pos);
                    txttotal.Text = calculartotales() + "";
                    txtcantidad.Text = calcularCantidad() + "";
                    return;
                }
                dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1);
                txttotal.Text = calculartotales() + "";
                txtcantidad.Text = calcularCantidad() + "";
            }
            txtcambio.Text = calcularcambio() + "";
        }
    }
}
